home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Cream of the Crop 26
/
Cream of the Crop 26.iso
/
doom
/
quake.zip
/
HIPGRAPL.ZIP
/
CHAIN.QC
< prev
next >
Wrap
Text File
|
1997-04-27
|
9KB
|
294 lines
/*
hook.dest = Last Origin of Owner
hook.style = Current chain sound
*/
/************\
* BreakChain *
\************/
void (entity Head) BreakChain =
{
local entity link;
link = Head.goalentity;
while (link != world)
{
Head = link.goalentity;
remove (link);
link = Head;
}
};
/*********\
* LinkPos *
\*********/
void () LinkPos =
{
makevectors (self.enemy.angles);
setorigin (self, self.owner.origin + ( ( ( self.enemy.origin +
(v_up * 20 * (!self.enemy.button2)) + (v_forward * 16) ) - self.owner.origin ) *
( self.weapon ) ) );
self.nextthink = time + 0.01;
};
/***********\
* MakeChain *
\***********/
entity (entity head, entity tail, float num) MakeChain =
{
local entity link, prevlink;
local float linknum;
linknum = num;
num = num + 1;
prevlink = world;
while (linknum > 0)
{
link = spawn();
link.goalentity = prevlink;
prevlink = link;
link.owner = head;
link.enemy = tail;
link.weapon = linknum / num;
link.movetype = MOVETYPE_NOCLIP;
link.solid = SOLID_NOT;
link.angles_z = 51 * linknum;
link.angles_y = 41 * linknum;
link.angles_x = 31 * linknum;
link.avelocity = '310 410 510';
setmodel (link, "progs/bit.mdl");
setsize (link, '0 0 0', '0 0 0');
makevectors (tail.angles);
setorigin (link, head.origin + ( ( ( tail.origin
+ (v_up * 20 * (!tail.button2)) + ( v_forward * 16 ) ) - head.origin )
* ( link.weapon ) ) );
link.nextthink = time + 0.01;
link.think = LinkPos;
linknum = linknum - 1;
}
return link;
};
/************\
* HookVanish *
\************/
void () HookVanish =
{
self.owner.hook_out = FALSE;
if (self.enemy.classname == "player")
self.enemy.attack_finished = time + 0.1;
sound (self.owner, CHAN_WEAPON, "weapons/bounce2.wav", 1, ATTN_NORM);
BreakChain (self);
remove (self);
};
/**********\
* HookPull *
\**********/
void () HookPull =
{
local vector vel, spray;
local float v, dorg;
if ((!self.owner.button0 && (self.owner.weapon == IT_MORNINGSTAR)) ||
(self.owner.teleport_time > time ) || self.owner.deadflag )
{
if (self.enemy.takedamage && (self.weapon > 0))
{ self.enemy.nextthink = time + 0.1; }
HookVanish();
return;
}
else
{
makevectors (self.owner.angles);
vel = self.origin - ( self.owner.origin + (v_up * 20 *
((1.25 * (!self.owner.button2)) - 0.25)) + (v_forward
* 16));
v = vlen (vel);
if (v <= 100)
vel = normalize(vel) * v * 10;
else
// KD - doubled the pull speed
// vel = normalize(vel) * 1000;
vel = normalize(vel) * 2000;
dorg = vlen (self.owner.origin - self.dest);
if ( ( dorg > 10 ) && (self.style == 3) )
{
sound (self.owner, CHAN_WEAPON, "weapons/chain2.wav", 1, ATTN_NORM);
self.style = 2;
}
if ( (dorg < 10) && (self.style == 2) )
{
sound (self.owner, CHAN_WEAPON, "weapons/chain3.wav", 1, ATTN_NORM);
self.style = 3;
}
self.owner.velocity = vel;
self.dest = self.owner.origin;
if (self.enemy.takedamage)
{
sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM);
T_Damage (self.enemy, self, self.owner, 1);
makevectors (self.v_angle);
spray_x = 100 * crandom();
spray_y = 100 * crandom();
spray_z = 100 * crandom() + 50;
SpawnBlood (self.origin, spray, 20);
// KD - removed this due to EXTREME annoyance
// at not being able to retaliate.
// If someone's hanging off of me by a chain
// embedded in my crotch, you better damn well
// believe I'll make use of that rocket launcher.
/*
if (self.weapon > 0)
{
self.enemy.nextthink = time + 9999999;
if (self.enemy.classname == "player")
self.enemy.attack_finished = time + 9999999;
}
*/
if (self.enemy.health <= 0)
{
if (self.weapon > 0)
self.enemy.nextthink = time + 0.1;
}
if (self.enemy.solid == SOLID_SLIDEBOX)
{
self.velocity = '0 0 0';
setorigin (self, self.enemy.origin +
self.enemy.mins +
(self.enemy.size * 0.5));
}
else
{
self.velocity = self.enemy.velocity;
}
}
else
{
self.velocity = self.enemy.velocity;
}
if (self.enemy.solid == SOLID_NOT)
{
HookVanish();
return;
}
self.nextthink = time + 0.1;
self.think = HookPull;
}
};
/**************\
* T_ChainTouch *
\**************/
void() T_ChainTouch =
{
local float rand;
if (other == self.owner)
return; // don't attach to owner
if (pointcontents(self.origin) == CONTENT_SKY)
{
HookVanish();
return;
}
if (other.takedamage)
{
T_Damage (other, self, self.owner, 10 );
SpawnBlood (self.origin, self.velocity, 10);
}
else
{
self.avelocity = '0 0 0';
}
sound (self, CHAN_AUTO, "weapons/bounce.wav", 1, ATTN_NORM);
if (!self.owner.button0)
{
HookVanish();
return;
}
else
{
if (other.solid == SOLID_SLIDEBOX)
{
setorigin (self, other.origin + other.mins +
(other.size * 0.5));
self.velocity = '0 0 0';
rand = random();
if (rand <= (vlen(other.origin - self.owner.origin) * 0.001))
sound (self.owner, CHAN_VOICE, "weapons/gotcha.wav",
1, ATTN_STATIC);
}
else
{
self.velocity = other.velocity;
}
self.weapon = other.nextthink - time;
sound (self.owner, CHAN_WEAPON, "weapons/chain2.wav", 1, ATTN_NORM);
self.style = 2;
self.enemy = other;
self.think = HookPull;
self.nextthink = time + 0.1;
self.touch = SUB_Null;
}
};
/*************\
* W_FireChain *
\*************/
void() W_FireChain =
{
local entity hook;
self.hook_out = TRUE;
hook = spawn ();
hook.owner = self;
hook.movetype = MOVETYPE_FLY;
hook.solid = SOLID_BBOX;
// set hook speed
makevectors (self.v_angle);
// KD - doubled firing speed to allow easier life-saving on HIPDM1
// hook.velocity = aim(self, 1000);
// hook.velocity = hook.velocity * 1000;
hook.velocity = aim(self, 2000);
hook.velocity = hook.velocity * 2000;
hook.angles = vectoangles(hook.velocity);
hook.avelocity = '0 0 -500';
hook.touch = T_ChainTouch;
// set hook sound
hook.think = HookVanish;
hook.nextthink = time + 5;
setmodel (hook, "progs/star.mdl");
setsize (hook, '0 0 0', '0 0 0');
setorigin (hook, self.origin + (v_forward*16) + '0 0 20' );
sound (self, CHAN_WEAPON, "weapons/chain1.wav", 1, ATTN_NORM);
hook.goalentity = MakeChain (hook, self, 8);
};